終於要進入到我熟悉的後端了,在Day5安裝XAMPP時有勾選了PHP、MySQL、phpMyAdmin,今天要介紹的是一套專門管理資料的程式語言,SQL專門負責資料的新增、修改、刪除。
常見的關聯式資料庫有MySQL及PostgreSQL,phpMyAdmin則是一套由PHP構成的Web-Base資料庫管理工具,這時可以使用UI操作來管理資料,也可以使用指令的方式,為了方便銜接後續的文章以及打指令看起來比較厲害所以以下示範都用指令,今天出門前忘記把有裝XAMPP環境的電腦開機了,希望晚上回家有空可以補上操作畫面。
假設一下今天要做的案例,我今天想要做一個點名系統,那主要管理的對象就會是人、出勤資料,那首先要做的事情就是建立一張表並且定義格式。
人的部分我會需要知道註冊順序、屬於自己的序號、使用者名稱、電話、建立時間、最後更新時間
新增使用者表(註1)
CREATE TABLE members(
id INT PRIMARY KEY,
member_id uuid,
name varchar(20),
phone_number varchar(13),
created_at timestamp,
updated_at timestamp
)
出勤的部分需要順序、出勤獨立序號、使用者獨立序號、建立時間、最後更新時間
新增出勤表(註2)
CREATE TABLE attendances(
id INT PRIMARY KEY,
attendances_id uuid,
member_id uuid,
created_at timestamp,
updated_at timestamp
)
移除出勤表
DROP TABLE attendances
新增一筆使用者資料
INSERT INTO members
(id, member_id, name, phone_number, created_at, updated_at)
VALUES (1,'92a1c094-4af7-4e9c-9a55-0cd1be3e86ae', 'cow', '0911111111', '2021-08-08 08:08:08', '2021-08-08 08:08:08')
一次新增多筆使用者資料
INSERT INTO members
VALUES (2,'92a1c094-4af7-4e9c-9a55-0cd1be3e86af', 'cow2', '0911111112', '2021-08-08 08:08:08', '2021-08-08 08:08:08'),
(3,'92a1c094-4af7-4e9c-9a55-0cd1be3e86ae', 'cow3', '0911111113', '2021-08-08 08:08:08', '2021-08-08 08:08:08'),
(4,'92a1c094-4af7-4e9c-9a55-0cd1be3e86aa', 'cow4', '0911111114', '2021-08-08 08:08:08', '2021-08-08 08:08:08')
新增一筆出勤資料
INSERT INTO attendances
(Id, attendances_id, member_id, created_at, updated_at)
VALUES(1, ‘92a1c094-4af7-4e9c-9a55-0cd1be3e86ab’, ‘92a1c094-4af7-4e9c-9a55-0cd1be3e86ac’, '2021-08-08 09:09:09’, '2021-08-08 09:09:09’)
取得所有使用者資料並且依照id排序 (註3)
SELECT *
FROM members
ORDER BY id DESC
將名為cow的使用者改名為very cow (註4)
UPDATE members
SET name = very cow
WHERE name = cow
移除一筆使用者資料 (註5)
DELETE FROM members
WHERE name = 'cow4'
取得一筆某一使用者的資料及全部出勤資料 (註6)
SELECT members.member_id, members."name", members.phone_number, attendances.created_at, attendances.updated_at
FROM members
INNER JOIN attendances
ON members.member_id = attendances.member_id
註1:
PRIMARY KEY每張表只會有一個欄位是主鍵,通常會設定為最常用來查詢的欄位
字串的欄位內建是儲存255個字,為了避免浪費空間能設定儲存字數是最好的
註2:
在出勤表裡面記了一個member_id是為了讓使用者表及出勤表有辦法連結在一起
註3:
沒事不要用*進行全表搜尋,負責管理資料庫的人會討厭你
ORDER BY有分ASC(正排序)及DESC(倒排序)
註4:
修改資料時條件一定要下清楚,不然全公司的人都會被改名為very cow
註5:
刪除資料時更要注意,資料刪除下去就救不回來了,如果公司資料被刪除,存款一定也會被老闆刪除
註6:
這邊講到了註2的讓兩張表連結在一起的JOIN指令,JOIN的種類也有很多可以再慢慢摸索
今天只有介紹最基本的操作,這邊稍微再提幾個資料庫的關鍵字:
1.有關聯式資料庫就有非關連式資料庫(NoSQL)
2.關聯式資料庫的正規化很重要
3.關聯式資料庫的索引(Index)很重要
今天的資料庫介紹就到這邊結束了,謝謝觀看的各位,請記得按讚分享開啟小鈴鐺,你的支持會讓按讚數+1。
----------------------------------我是更正分隔線----------------------------------
1.id型別可以加上 AUTO_INCREMENT,這樣輸入資料時系統會自動幫忙+1比較聰明
2.MySQL並沒有uuid型別,上方有用到uuid型別的皆須更改為varchar(36),原因是因為uuid型別固定是36個字元
3.timestamp型別需加入NOT NULL DEFAULT NOW(),因打文章時使用的是PostgreSQL無法測試,在此更正
4.新增 attendances 表時 attendance_id 為單數不是 attendances_id
5.如下圖所示,啟用phpadmin的方式為 url 打上 127.0.0.1/phpadmin即可進入服務,進入後選取左邊新增來增加資料庫
6.於1的地方輸入資料庫名稱、2的地方選取utf8_general_ci,此參數與儲存文字時有關,如果選錯可能會造成中文字無法正確儲存,但這部分我並沒有深入研究
7.時間可以用NOW()函數、uuid可以用uuid()函數創建
8.選取上方SQL後可直接下指令操作資料庫,於1的地方注意不要跑錯資料庫,2的地方送出指令
9.將SQL全部確認是否正確後整理於下方可直接使用
CREATE TABLE members(
id INT PRIMARY KEY AUTO_INCREMENT,
member_id varchar(36),
name varchar(20),
phone_number varchar(14),
created_at timestamp NOT NULL DEFAULT NOW(),
updated_at timestamp NOT NULL DEFAULT NOW()
)
CREATE TABLE attendances(
id INT PRIMARY KEY AUTO_INCREMENT,
attendance_id varchar(36),
member_id varchar(36),
created_at timestamp NOT NULL DEFAULT NOW(),
updated_at timestamp NOT NULL DEFAULT NOW()
)
DROP TABLE attendances
INSERT INTO members
(member_id, name, phone_number, created_at, updated_at)
VALUES (uuid(), 'cow', '0911111111', NOW(), NOW())
INSERT INTO members
(member_id, name, phone_number, created_at, updated_at)
VALUES(uuid(), 'cow2', '0911111112', NOW(), NOW()),
(uuid(), 'cow3', '0911111113', NOW(), NOW()),
(uuid(), 'cow4', '0911111114', NOW(), NOW())
INSERT INTO attendances
(attendance_id, member_id, created_at, updated_at)
VALUES(uuid(), (SELECT member_id FROM members WHERE name='cow1'), NOW(), NOW())
SELECT *
FROM members
ORDER BY id DESC
UPDATE members
SET name = 'very cow'
WHERE name = 'cow1'
DELETE FROM members
WHERE name = 'cow4'
SELECT members.member_id,members.name,members.phone_number,attendances.created_at,attendances.updated_at
FROM members
INNER JOIN attendances